package DAOs;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;

import Beans.Veiling;
import Database.DBmanager;

public class VeilingDAO {

	private String sqlVeilingOpenstaand = "SELECT * from APP.VEILINGEN WHERE ENDDATE >= ? ORDER BY enddate DESC";
	private String sqlVeilingGesloten = "SELECT * from APP.VEILINGEN WHERE ENDDATE <= ? ORDER BY enddate DESC";
	private String sqlVeilingCreate = "insert into APP.VEILINGEN(STARTERID, ARTIKELNAAM, BESCHRIJVING, HOOGBOD, IMAGEURL, STARTDATE, ENDDATE) values (?, ?, ?, ?, ?, ?, ?)";
	private String sqlVeilingRead = "SELECT * FROM APP.VEILINGEN "; // starterID,
	private String sqlVeilingReadLimited = "SELECT * FROM APP.VEILINGEN FETCH FIRST ? ROWS ONLY"; // starterID,
	
	// hoogBodID,
	// veilingID,
	// artikelNaam,
	// imageURL,
	// beschrijving,
	// startDate,
	// endDate
	// FROM
	// APP.VEILINGEN";
	private String sqlGebruikerRead = "SELECT * FROM APP.USERS WHERE UserID = ?";
	private String sqlVeilingDelete = "DELETE FROM APP.VEILINGEN where VEILINGID = ?";
	private String sqlVeilingUpdate = "UPDATE APP.VEILINGEN SET HOOGBOD = ? WHERE VEILINGID = ?";



	private Connection con 						= null;
	private PreparedStatement psCreate 			= null;
	private PreparedStatement psRead 			= null;
	private PreparedStatement psReadLimited		= null;
	private PreparedStatement psGebruikerRead	= null;
	private PreparedStatement psDelete 			= null;
	private PreparedStatement psUpdate 			= null;

	private PreparedStatement psOpenstaand 		= null;
	private PreparedStatement psGesloten 		= null;

	public VeilingDAO() {
		DBmanager myDb = DBmanager.getInstance();
		con = myDb.getConnection();

		try {
			this.psCreate = con.prepareStatement(sqlVeilingCreate);
			this.psRead = con.prepareStatement(sqlVeilingRead);
			this.psReadLimited = con.prepareStatement(sqlVeilingReadLimited);
			this.psGebruikerRead = con.prepareStatement(sqlGebruikerRead);
			this.psDelete = con.prepareStatement(sqlVeilingDelete);
			this.psUpdate = con.prepareStatement(sqlVeilingUpdate);

			this.psOpenstaand = con.prepareStatement(sqlVeilingOpenstaand);
			this.psGesloten = con.prepareStatement(sqlVeilingGesloten);

			Statement stmt = con.createStatement();

			stmt.close();
		} catch (SQLException se) {
			printSQLException(se);

		}

	}

	public LinkedList<Veiling> getAllVeilingen(){

		LinkedList<Veiling> llVeilingen = new LinkedList<Veiling>();

		try{
			ResultSet rs = psRead.executeQuery();
			while(rs.next()){
				int starterID = rs.getInt(1);
				int hoogbod = rs.getInt(2);
				int veilingID = rs.getInt(3);
				String artikelNaam = rs.getString(4);
				String imageURL = rs.getString(5);
				String beschrijving = rs.getString(6);
				long startDate = rs.getLong(7);
				long endDate = rs.getLong(8);

				psGebruikerRead.clearParameters();
				psGebruikerRead.setInt(1, starterID);

				Beans.Gebruiker starter = new Beans.Gebruiker();

				try{
					ResultSet rsg1 = psGebruikerRead.executeQuery();
					while(rsg1.next()){
						int userID 	= rsg1.getInt(1);
						int saldo	= rsg1.getInt(2);
						String voornaam = rsg1.getString(3);
						String achternaam = rsg1.getString(4);
						String email = rsg1.getString(5);
						String telefoon = rsg1.getString(6);
						String wachtwoord = rsg1.getString(7);
						String adres = rsg1.getString(8);

						starter.setAll(userID, voornaam, achternaam, saldo, email, wachtwoord, adres, telefoon);
					}		
					rsg1.close();
				}

				catch(SQLException se){
					printSQLException (se);
				}
				psGebruikerRead.clearParameters();
				psGebruikerRead.setInt(1, hoogbod);
				Beans.Gebruiker hoogsteBieder = new Beans.Gebruiker();
				try{
					ResultSet rsg2 = psGebruikerRead.executeQuery();
					while(rsg2.next()){
						int userID 	= rsg2.getInt(1);
						int saldo	= rsg2.getInt(2);
						String voornaam = rsg2.getString(3);
						String achternaam = rsg2.getString(4);
						String email = rsg2.getString(5);
						String telefoon = rsg2.getString(6);
						String wachtwoord = rsg2.getString(7);
						String adres = rsg2.getString(8);

						hoogsteBieder.setAll(userID, voornaam, achternaam, saldo, email, wachtwoord, adres, telefoon);
					}
					rsg2.close();					
				}
				catch(SQLException se){
					printSQLException (se);
				}

				Veiling vb = new Veiling();
				vb.setAll(starter, hoogsteBieder, veilingID, artikelNaam, imageURL, beschrijving, startDate, endDate);
				llVeilingen.add(vb);
			}
			rs.close();
		}
		catch(SQLException se){
			printSQLException(se);
		}
		return llVeilingen;
	}
	
	public LinkedList<Veiling> getAllVeilingen(int maxResults){

		LinkedList<Veiling> llVeilingen = new LinkedList<Veiling>();

		try{
			ResultSet rs = psReadLimited.executeQuery();
			psReadLimited.clearParameters();
			psReadLimited.setInt(1, maxResults);
			
			while(rs.next()){
				int starterID = rs.getInt(1);
				int hoogbod = rs.getInt(2);
				int veilingID = rs.getInt(3);
				String artikelNaam = rs.getString(4);
				String imageURL = rs.getString(5);
				String beschrijving = rs.getString(6);
				long startDate = rs.getLong(7);
				long endDate = rs.getLong(8);

				psGebruikerRead.clearParameters();
				psGebruikerRead.setInt(1, starterID);

				Beans.Gebruiker starter = new Beans.Gebruiker();

				try{
					ResultSet rsg1 = psGebruikerRead.executeQuery();
					while(rsg1.next()){
						int userID 	= rsg1.getInt(1);
						int saldo	= rsg1.getInt(2);
						String voornaam = rsg1.getString(3);
						String achternaam = rsg1.getString(4);
						String email = rsg1.getString(5);
						String telefoon = rsg1.getString(6);
						String wachtwoord = rsg1.getString(7);
						String adres = rsg1.getString(8);

						starter.setAll(userID, voornaam, achternaam, saldo, email, wachtwoord, adres, telefoon);
					}		
					rsg1.close();
				}

				catch(SQLException se){
					printSQLException (se);
				}
				psGebruikerRead.clearParameters();
				psGebruikerRead.setInt(1, hoogbod);
				Beans.Gebruiker hoogsteBieder = new Beans.Gebruiker();
				try{
					ResultSet rsg2 = psGebruikerRead.executeQuery();
					while(rsg2.next()){
						int userID 	= rsg2.getInt(1);
						int saldo	= rsg2.getInt(2);
						String voornaam = rsg2.getString(3);
						String achternaam = rsg2.getString(4);
						String email = rsg2.getString(5);
						String telefoon = rsg2.getString(6);
						String wachtwoord = rsg2.getString(7);
						String adres = rsg2.getString(8);

						hoogsteBieder.setAll(userID, voornaam, achternaam, saldo, email, wachtwoord, adres, telefoon);
					}
					rsg2.close();					
				}
				catch(SQLException se){
					printSQLException (se);
				}

				Veiling vb = new Veiling();
				vb.setAll(starter, hoogsteBieder, veilingID, artikelNaam, imageURL, beschrijving, startDate, endDate);
				llVeilingen.add(vb);
			}
			rs.close();
		}
		catch(SQLException se){
			printSQLException(se);
		}
		return llVeilingen;
	}


	public void createVeiling(int starterID, String artikelNaam, String beschrijving, int hoogbod, String imageUrl, long startDate, long endDate) {

		try {
			psCreate.clearParameters();

			psCreate.setInt(1, starterID);
			psCreate.setString(2, artikelNaam);
			psCreate.setString(3, beschrijving);
			psCreate.setInt(4, hoogbod);
			psCreate.setString(5, imageUrl);
			psCreate.setLong(6, startDate);
			psCreate.setLong(7, endDate);

			int resultaat = psCreate.executeUpdate();
			if (resultaat == 0) {
				System.out.println("niets gebeurd in createVeiling");
			}

		} catch (SQLException se) {
			printSQLException(se);
		}
	}

	public void updateVeiling(String hoogbod, String veilingID) {
		try {
			psUpdate.clearParameters();

			psUpdate.setString(1, hoogbod);
			psUpdate.setString(2, veilingID);

			int resultaat = psUpdate.executeUpdate();
			if (resultaat == 0) {
				System.out.println("niets gebeurd in updateVeiling");
			}
		}

		catch (SQLException se) {
			printSQLException(se);
		}

	}

	public void deleteVeiling(int veilingID) {
		try {
			psDelete.clearParameters();
			psDelete.setInt(1, veilingID);

			int resultaat = psDelete.executeUpdate();
			if (resultaat == 0) {
				System.out.println("niets gebeurd in deleteVeiling");
			}
		} catch (SQLException se) {
			printSQLException(se);
		}
	}

	private void printSQLException(SQLException se) {
		while (se != null) {

			se.printStackTrace();
			System.out.print("SQLException: State:   " + se.getSQLState());
			System.out.println("Severity: " + se.getErrorCode());
			System.out.println(se.getMessage());

			se = se.getNextException();
		}
	}

	public LinkedList<Veiling> getOpenstaandeVeilingen() {

		LinkedList<Veiling> llVeilingen = new LinkedList<Veiling>();

		try{
			psOpenstaand.setLong(1, System.currentTimeMillis());
			ResultSet rs = psOpenstaand.executeQuery();
			while(rs.next()){
				int starterID = rs.getInt(1);
				int hoogbod = rs.getInt(2);
				int veilingID = rs.getInt(3);
				String artikelNaam = rs.getString(4);
				String imageURL = rs.getString(5);
				String beschrijving = rs.getString(6);
				long startDate = rs.getLong(7);
				long endDate = rs.getLong(8);

				psGebruikerRead.clearParameters();
				psGebruikerRead.setInt(1, starterID);

				Beans.Gebruiker starter = new Beans.Gebruiker();

				try{
					ResultSet rsg1 = psGebruikerRead.executeQuery();
					while(rsg1.next()){
						int userID 	= rsg1.getInt(1);
						int saldo	= rsg1.getInt(2);
						String voornaam = rsg1.getString(3);
						String achternaam = rsg1.getString(4);
						String email = rsg1.getString(5);
						String telefoon = rsg1.getString(6);
						String wachtwoord = rsg1.getString(7);
						String adres = rsg1.getString(8);

						starter.setAll(userID, voornaam, achternaam, saldo, email, wachtwoord, adres, telefoon);
					}		
					rsg1.close();
				}

				catch(SQLException se){
					printSQLException (se);
				}
				psGebruikerRead.clearParameters();
				psGebruikerRead.setInt(1, hoogbod);
				Beans.Gebruiker hoogsteBieder = new Beans.Gebruiker();
				try{
					ResultSet rsg2 = psGebruikerRead.executeQuery();
					while(rsg2.next()){
						int userID 	= rsg2.getInt(1);
						int saldo	= rsg2.getInt(2);
						String voornaam = rsg2.getString(3);
						String achternaam = rsg2.getString(4);
						String email = rsg2.getString(5);
						String telefoon = rsg2.getString(6);
						String wachtwoord = rsg2.getString(7);
						String adres = rsg2.getString(8);

						hoogsteBieder.setAll(userID, voornaam, achternaam, saldo, email, wachtwoord, adres, telefoon);
					}
					rsg2.close();					
				}
				catch(SQLException se){
					printSQLException (se);
				}

				Veiling vb = new Veiling();
				vb.setAll(starter, hoogsteBieder, veilingID, artikelNaam, imageURL, beschrijving, startDate, endDate);
				llVeilingen.add(vb);
			}
			rs.close();
		}
		catch(SQLException se){
			printSQLException(se);
		}
		return llVeilingen;

	}

	public LinkedList<Veiling> getGeslotenVeilingen() {


		LinkedList<Veiling> llVeilingen = new LinkedList<Veiling>();

		try{
			psGesloten.setLong(1, System.currentTimeMillis());
			ResultSet rs = psGesloten.executeQuery();
			while(rs.next()){
				int starterID = rs.getInt(1);
				int hoogbod = rs.getInt(2);
				int veilingID = rs.getInt(3);
				String artikelNaam = rs.getString(4);
				String imageURL = rs.getString(5);
				String beschrijving = rs.getString(6);
				long startDate = rs.getLong(7);
				long endDate = rs.getLong(8);

				psGebruikerRead.clearParameters();
				psGebruikerRead.setInt(1, starterID);

				Beans.Gebruiker starter = new Beans.Gebruiker();

				try{
					ResultSet rsg1 = psGebruikerRead.executeQuery();
					while(rsg1.next()){
						int userID 	= rsg1.getInt(1);
						int saldo	= rsg1.getInt(2);
						String voornaam = rsg1.getString(3);
						String achternaam = rsg1.getString(4);
						String email = rsg1.getString(5);
						String telefoon = rsg1.getString(6);
						String wachtwoord = rsg1.getString(7);
						String adres = rsg1.getString(8);

						starter.setAll(userID, voornaam, achternaam, saldo, email, wachtwoord, adres, telefoon);
					}		
					rsg1.close();
				}

				catch(SQLException se){
					printSQLException (se);
				}
				psGebruikerRead.clearParameters();
				psGebruikerRead.setInt(1, hoogbod);
				Beans.Gebruiker hoogsteBieder = new Beans.Gebruiker();
				try{
					ResultSet rsg2 = psGebruikerRead.executeQuery();
					while(rsg2.next()){
						int userID 	= rsg2.getInt(1);
						int saldo	= rsg2.getInt(2);
						String voornaam = rsg2.getString(3);
						String achternaam = rsg2.getString(4);
						String email = rsg2.getString(5);
						String telefoon = rsg2.getString(6);
						String wachtwoord = rsg2.getString(7);
						String adres = rsg2.getString(8);

						hoogsteBieder.setAll(userID, voornaam, achternaam, saldo, email, wachtwoord, adres, telefoon);
					}
					rsg2.close();					
				}
				catch(SQLException se){
					printSQLException (se);
				}

				Veiling vb = new Veiling();
				vb.setAll(starter, hoogsteBieder, veilingID, artikelNaam, imageURL, beschrijving, startDate, endDate);
				llVeilingen.add(vb);
			}
			rs.close();
		}
		catch(SQLException se){
			printSQLException(se);
		}
		return llVeilingen;
	}

}
